﻿using Max.PH4_2102A.Shopping.Domain;
using Max.PH4_2102A.Shopping.DTO;
using Max.PH4_2102A.Shopping.IRespository;
using Max.PH4_2102A.Shopping.IService;

namespace Max.PH4_2102A.Shopping.Service
{
    public class UserService : IUserService
    {

        IUserRespository _respository;
        public UserService(IUserRespository respository)
        {
            _respository = respository;
        }

        public int Insert(UserInsertInputDto dto)
        {
            //添加时候，需要判断重复项
            var m = _respository.GetAll().Where(x => x.Phone.Equals(dto.Phone)).FirstOrDefault();
            if (m != null)
            {
                //表示登录名称已存在，不能重复添加
                return -1;
            }

            UserModel model = new UserModel()
            {
                HeadImage = dto.HeadImage,
                Phone = dto.Phone,
                Password =  MD5Hash.Hash.GetMD5( dto.Password),
                Remark = dto.Remark,
            };

            int result = _respository.Insert(model);
            return result;
        }

        //获取分页带查询数据
        public IQueryable<UserModel> GetAll(string username, int pageIndex, int pageSize,out int total)
        {
            var list = _respository.GetAll();
            //??类似三目运算符：当??前面的变量为null时，则取??后面的数据，否则取??前面变量本身的值
            list = list.Where(x => x.Phone.Contains(username ?? ""));

            total = list.Count();

            list = list.Skip((pageIndex - 1) * pageSize).Take(pageSize);
            return list;
        }

        //获取所有数据
        public IQueryable<UserModel> GetAll()
        {
            var list = _respository.GetAll();
            return list;
        }

        /// <summary>
        /// 登录方法
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns>Tuple：元祖（尖括号中：最多8个参数，参数也可以是Tuple）</returns>
        /// <exception cref="NotImplementedException"></exception>
        public Tuple<bool, string, UserInfoOutputDto> Login(string username, string password)
        {
            //去所有的数据中，找到这个和登录用户名匹配的用户
            //.where找出来的是IQueryable(集合），而实际上如果能找用户，最多只有一条，因为不能出现重复的登录用户名
            //所以用 FirstOrDefault
            var m = _respository.GetAll().Where(x => x.Phone.Equals(username)).FirstOrDefault();

            if (m == null)
            {
                //用户不存在
                return Tuple.Create<bool, string, UserInfoOutputDto>(false, "用户不存在", null);
            }

            //password = MD5Hash.Hash.Content(password);
            if (!m.Password.Equals(password))
            {
                //用户密码不对
                return Tuple.Create<bool, string, UserInfoOutputDto>(false, "密码不正确", null);
            }

            if (m.State != UserStateEnum.Used)
            {
                //用户已被锁定，还未解锁
                return Tuple.Create<bool, string, UserInfoOutputDto>(false, "用户已锁定", null);
            }


            UserInfoOutputDto dto = new UserInfoOutputDto()
            {
                HeadImage = m.HeadImage,
                Id = m.Id,
                Phone = m.Phone
            };

            return Tuple.Create<bool, string, UserInfoOutputDto>(true, "登录成功", dto);
        }

        /// <summary>
        /// 锁定用户：没有登录进去，只知道账号
        /// </summary>
        /// <param name="phone"></param>
        public int LockUser(string phone)
        {
            int result = 0;
            //锁定用户是什么操作？修改状态
            //通过这个账号去查找这条用户信息 ---才会有id
            //把这条信息修改为锁定
            var m = _respository.GetAll().Where(x => x.Phone.Equals(phone)).FirstOrDefault();
            if (m != null)
            {
                m.State = UserStateEnum.Disabled;
                result = _respository.Update(m);
            }

            return result;
        }
    }
}